// 用户相关的小仓库
import { defineStore } from "pinia"
// 引入登入请求接口
import { reqLogin, reqUserInfo, reqLogout } from "@/api/user/index"
import type {
    loginFormData,
    loginResponseData,
    userInfoReponseData,
} from "@/api/user/type"
import type { UserState } from "@/store/modules/types/type"
// 引入操作本地存储的工具方法
import { SET_TOKEN, GET_TOKEN, REMOVE_TOKEN } from "@/utils/token"

//引入路由
import { constantRoute } from "@/router/routes.ts"
// 创建用户小仓库
let useUserStore = defineStore("User", {
    // 小仓库存储数据的地方
    state: (): UserState => {
        return {
            token: GET_TOKEN(), //用户的唯一标识token
            menuRoutes: constantRoute, //仓库存储菜单路由
            username: "", //用户名
            avatar: "", //用户头像
            roles: [], //角色
            permissions: [], //权限
        }
    },
    // 异步、逻辑
    actions: {
        //用户登录的方法
        async userLogin(data: loginFormData) {
            //登录请求
            const result: loginResponseData = await reqLogin(data)
            //登录请求:成功200->token
            //登录请求:失败201->登录失败错误的信息
            if (result.code == 200) {
                //pinia仓库存储一下token
                //由于pinia|vuex存储数据其实利用js对象
                this.token = result.data as string
                //本地存储持久化存储一份
                SET_TOKEN(result.data as string)
                //能保证当前async函数返回一个成功的promise
                return "ok"
            } else {
                //使用未知类型的值 必须先进行类型检查或者类型断言
                //类型检查:typeof先判断类型
                //result.msg不确定类型则使用类型断言来告诉 TypeScript result.msg 的类型
                // (使用 as 关键字将 result.msg 断言为 string 类型)
                if (typeof result === "object" && "msg" in result) {
                    return Promise.reject(new Error(result.msg as string))
                }
            }
        },
        //获取用户信息方法
        userInfo() {
            return new Promise(async (resolve, reject) => {
                //获取用户信息进行存储仓库当中[用户头像、名字]
                const result: userInfoReponseData = await reqUserInfo()
                //如果获取用户信息成功，存储一下用户信息
                if (result.code == 200) {
                    //用户基本信息
                    this.username = result.data.user.name
                    this.avatar = result.data.user.avatar
                    //用户权限
                    this.roles = result.data.roles
                    this.permissions = result.data.permissions
                    //todo 菜单
                    return resolve(result)
                } else {
                    return reject(new Error(result.message))
                }
            })
        },
        //退出登录
        async userLogout() {
            //退出登录请求
            const result: any = await reqLogout()
            if (result.code == 200) {
                this.token = ""
                this.username = ""
                this.avatar = ""
                REMOVE_TOKEN()
                return "ok"
            } else {
                return Promise.reject(new Error(result.message))
            }
        },
    },
    getters: {},
})

export default useUserStore
